3  Application in Cox PH models

Comparison of coxph versus svycoxph after multiple imputation and propensity score matching

Author

Janick Weberpals, RPh, PhD

Published

September 19, 2024

In Chapter 3 we illustrate a reproducible example on how to use coxph (survival package (Therneau 2024)) and svycoxph (survey package (Lumley 2024)) in combination with multiple imputation by chained equations (mice package (Buuren and Groothuis-Oudshoorn 2011)) and propensity score matching using the MatchThem package (Pishgar et al. 2021).

First, we load the required R libraries/packages and some custom functions that are part of the encore.io R package that is being developed to streamline the analysis of all ENCORE trial emulations (non-public package).

library(dplyr)
library(survival)
library(mice)
library(MatchThem)
library(survey)
library(here)
library(gtsummary)
library(parallelly)
library(ranger)
library(furrr)
library(cobalt)

source(here("functions", "source_encore.io_functions.R"))

# track time
runtime <- tictoc::tic()

3.1 Data generation

We use the simulate_flaura() function to simulate a realistic oncology comparative effectiveness analytic cohort dataset with similar distributions to FLAURA, a randomized controlled trial that evaluated the efficacy and safety of osimertinib to standard-of-care (SoC) tyrosine kinase inhibitors (TKIs) in advanced NSCLC patients with a sensitizing EGFR mutation.

The following cohort resembles distributions observed in the EHR-derived EDB1dataset used in ENCORE. Note: the values of some continuous covariates (labs) are displayed after log/log-log transformation.

# load example dataset with missing observations
data_miss <- simulate_flaura(
  n_total = 3500, 
  seed = 42, 
  include_id = FALSE, 
  imposeNA = TRUE
  )

# crate Table 1
data_miss |> 
  tbl_summary(
    by = "treat", 
    include = covariates_for_imputation
    ) |> 
  add_overall() |> 
  modify_header(
    label ~ "**Patient characteristic**",
    stat_0 ~ "**Total** <br> N = {N}",
    stat_1 ~ "**Comparator** <br> N = {n} <br> ({style_percent(p, digits=1)}%)",
    stat_2 ~ "**Exposure** <br> N = {n} <br> ({style_percent(p, digits=1)}%)"
    ) |> 
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**") |> 
  modify_caption("**Table 1. Patient Characteristics**")
Table 1. Patient Characteristics

Patient characteristic

Total
N = 3500

1

Treatment received

Comparator
N = 2069
(59.1%)

1

Exposure
N = 1431
(40.9%)

1
dem_age_index_cont 69 (64, 74) 69 (63, 74) 69 (64, 74)
dem_sex_cont 1,146 (33%) 676 (33%) 470 (33%)
c_smoking_history 1,037 (44%) 653 (47%) 384 (41%)
    Unknown 1,162 677 485
c_number_met_sites


    1 1,742 (75%) 1,043 (75%) 699 (74%)
    2 501 (21%) 293 (21%) 208 (22%)
    3 77 (3.3%) 44 (3.2%) 33 (3.5%)
    4 16 (0.7%) 10 (0.7%) 6 (0.6%)
    5 2 (<0.1%) 2 (0.1%) 0 (0%)
    Unknown 1,162 677 485
c_hemoglobin_g_dl_cont 12.89 (11.99, 13.83) 12.87 (11.96, 13.83) 12.94 (12.03, 13.84)
    Unknown 1,162 677 485
c_urea_nitrogen_mg_dl_cont 2.72 (2.51, 2.93) 2.72 (2.51, 2.93) 2.72 (2.51, 2.92)
    Unknown 1,162 677 485
c_platelets_10_9_l_cont 262 (225, 297) 261 (225, 298) 263 (224, 297)
    Unknown 1,162 677 485
c_calcium_mg_dl_cont 2.23 (2.20, 2.26) 2.23 (2.20, 2.26) 2.23 (2.20, 2.26)
    Unknown 1,162 677 485
c_glucose_mg_dl_cont 4.64 (4.56, 4.71) 4.64 (4.57, 4.71) 4.64 (4.56, 4.71)
    Unknown 1,162 677 485
c_lymphocyte_leukocyte_ratio_cont 2.87 (2.75, 2.99) 2.87 (2.75, 2.99) 2.88 (2.75, 2.99)
    Unknown 1,162 677 485
c_alp_u_l_cont 4.48 (4.39, 4.56) 4.47 (4.39, 4.56) 4.48 (4.40, 4.56)
    Unknown 1,162 677 485
c_protein_g_l_cont 68.1 (65.4, 70.6) 68.1 (65.4, 70.6) 68.0 (65.3, 70.7)
    Unknown 1,162 677 485
c_alt_u_l_cont 2.89 (2.66, 3.09) 2.88 (2.66, 3.09) 2.89 (2.66, 3.10)
    Unknown 1,162 677 485
c_albumin_g_l_cont 40.0 (37.9, 42.0) 39.9 (37.8, 41.9) 40.0 (38.1, 42.2)
    Unknown 1,162 677 485
c_bilirubin_mg_dl_cont -0.92 (-1.79, -0.09) -0.83 (-1.71, 0.00) -1.08 (-1.89, -0.24)
    Unknown 1,162 677 485
c_chloride_mmol_l_cont 102.09 (100.05, 104.09) 102.09 (99.97, 104.08) 102.10 (100.12, 104.17)
    Unknown 1,162 677 485
c_monocytes_10_9_l_cont -0.51 (-0.67, -0.34) -0.51 (-0.68, -0.35) -0.51 (-0.67, -0.33)
    Unknown 1,162 677 485
c_eosinophils_leukocytes_ratio_cont 0.69 (0.31, 1.09) 0.70 (0.33, 1.12) 0.67 (0.28, 1.06)
    Unknown 1,162 677 485
c_ldh_u_l_cont 1.69 (1.65, 1.72) 1.69 (1.65, 1.72) 1.69 (1.66, 1.72)
    Unknown 1,162 677 485
c_hr_cont 4.43 (4.40, 4.46) 4.43 (4.40, 4.45) 4.43 (4.40, 4.46)
    Unknown 1,162 677 485
c_sbp_cont 4.85 (4.79, 4.91) 4.85 (4.79, 4.91) 4.85 (4.79, 4.92)
    Unknown 1,162 677 485
c_oxygen_cont 97.000 (96.994, 97.007) 97.000 (96.993, 97.007) 97.000 (96.994, 97.007)
    Unknown 1,162 677 485
c_ecog_cont 1,341 (57%) 842 (60%) 499 (53%)
    Unknown 1,162 677 485
c_neutrophil_lymphocyte_ratio_cont 1.30 (1.03, 1.55) 1.30 (1.04, 1.55) 1.30 (1.03, 1.55)
    Unknown 1,162 677 485
c_bmi_cont 3.23 (3.14, 3.32) 3.23 (3.14, 3.32) 3.23 (3.14, 3.32)
    Unknown 1,162 677 485
c_ast_alt_ratio_cont 0.12 (-0.08, 0.31) 0.11 (-0.08, 0.31) 0.12 (-0.08, 0.31)
    Unknown 1,162 677 485
c_stage_initial_dx_cont


    1 32 (1.4%) 23 (1.7%) 9 (1.0%)
    2 63 (2.7%) 41 (2.9%) 22 (2.3%)
    3 455 (19%) 276 (20%) 179 (19%)
    4 1,788 (76%) 1,052 (76%) 736 (78%)
    Unknown 1,162 677 485
c_de_novo_mets_dx 1,856 (79%) 1,104 (79%) 752 (79%)
    Unknown 1,162 677 485
c_height_cont 1.65 (1.60, 1.70) 1.65 (1.59, 1.70) 1.65 (1.60, 1.70)
    Unknown 1,162 677 485
c_weight_cont 69 (61, 76) 69 (61, 76) 69 (61, 76)
    Unknown 1,162 677 485
c_year_index


    <2018 3,324 (95%) 1,978 (96%) 1,346 (94%)
    2018+ 176 (5.0%) 91 (4.4%) 85 (5.9%)
c_dbp_cont 76.2 (72.0, 80.2) 76.0 (71.7, 80.2) 76.4 (72.3, 80.2)
    Unknown 1,162 677 485
death_itt 3,481 (99%) 2,061 (100%) 1,420 (99%)
fu_itt_months 16 (8, 32) 15 (7, 29) 19 (9, 36)
1

Median (Q1, Q3); n (%)

3.2 Step 1 - Multiple imputation

The first step after deriving the analytic cohort includes the creation of multiple imputed datasets using mice R package(Buuren and Groothuis-Oudshoorn 2011).

The mice algorithm is one particular instance of a fully conditionally specified model. The algorithm starts with a random draw from the observed data, and imputes the incomplete data in a variable-by-variable fashion. One iteration consists of one cycle through all \(Y_j\).

MICE algorithm for imputation of multivariate missing data.

MICE algorithm for imputation of multivariate missing data.

The number of iterations \(M\) (= number of imputed datasets) in this example is 10, but in ENCORE we follow Stef van Buuren’s advice:

[…] if calculation is not prohibitive, we may set \(M\) to the average percentage of missing data.

(Flexible imputation of Missing Data, Sub-chapter 2.8)

Following the results of various simulation studies (Shah et al. 2014; Weberpals et al. 2024), we use a non-parametric (random forest-based) imputation approach as the actual imputation algorithm.

Advantages of non-parametric imputation approaches
  • Parametric imputation models have to be correctly specified, i.e. also have to explicitly model nonlinear and non-additive covariate relationships

  • Many imputation algorithms are not prepared for mixed type of data

  • Popular: random forest-based algorithms

Note: In this example we utilize the futuremice() instead of the legacy mice() function to run the mice imputation across 3 cores in parallel.

# impute data
data_imp <- futuremice(
  parallelseed = 42,
  n.core = parallel::detectCores()-1,
  data = data_miss,
  method = "rf",
  m = 10,
  print = FALSE
  )

The imputation step creates an object of class…

class(data_imp)
[1] "mids"

…which stands for multiple imputed datasets. It contains important information on the imputation procedure and the actual imputed datasets.

3.3 Step 2 - Propensity score matching and weighting

Apply propensity score matching and weighting with replacement within in each imputed dataset. As pointed in Section 2.3.1, the MIte approach performed best in terms of bias, standardized differences/balancing, coverage rate and variance estimation. In MatchThem this approach is referred to a within approach (performing matching within each dataset), while the inferior MIps approach (estimating propensity scores within each dataset, averaging them across datasets, and performing matching using the averaged propensity scores in each dataset) is referred to as across approach. Since MIte/within has been shown to have superior performance in most cases, we only illustrate this approach here.

Let’s assume we fit the following propensity score model within each imputed dataset.

# apply propensity score matching on mids object
ps_form <- as.formula(paste("treat ~", paste(covariates_for_ps, collapse = " + ")))
ps_form
treat ~ dem_age_index_cont + dem_sex_cont + c_smoking_history + 
    c_number_met_sites + c_hemoglobin_g_dl_cont + c_urea_nitrogen_mg_dl_cont + 
    c_platelets_10_9_l_cont + c_calcium_mg_dl_cont + c_glucose_mg_dl_cont + 
    c_lymphocyte_leukocyte_ratio_cont + c_alp_u_l_cont + c_protein_g_l_cont + 
    c_alt_u_l_cont + c_albumin_g_l_cont + c_bilirubin_mg_dl_cont + 
    c_chloride_mmol_l_cont + c_monocytes_10_9_l_cont + c_eosinophils_leukocytes_ratio_cont + 
    c_ldh_u_l_cont + c_hr_cont + c_sbp_cont + c_oxygen_cont + 
    c_ecog_cont + c_neutrophil_lymphocyte_ratio_cont + c_bmi_cont + 
    c_ast_alt_ratio_cont + c_stage_initial_dx_cont + dem_race + 
    dem_region + dem_ses + c_time_dx_to_index

The matching step happens using the matchthem() function, which is a wrapper around the matchit() function. This function not only provides the functionality to match on the propensity score, but also to perform (coarsened) exact matching, cardinality matching, genetic matching and more. In this example, we use a simple 1:1 nearest neighbor matching on the propensity score (estimated through logistic regression) without replacement with a caliper of 1% of the standard deviation of the propensity score.

# matching
data_mimids <- matchthem(
  formula = ps_form,
  datasets = data_imp,
  approach = 'within',
  method = 'nearest',
  distance = "glm",
  link = "logit",
  caliper = 0.01,
  ratio = 1,
  replace = F
  )

# print summary for matched dataset #1
data_mimids
A matchit object
 - method: 1:1 nearest neighbor matching without replacement
 - distance: Propensity score [caliper]
             - estimated with logistic regression
 - caliper: <distance> (0.001)
 - number of obs.: 3500 (original), 2578 (matched)
 - target estimand: ATT
 - covariates: dem_age_index_cont, dem_sex_cont, c_smoking_history, c_number_met_sites, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_ecog_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_stage_initial_dx_cont, dem_race, dem_region, dem_ses, c_time_dx_to_index

The resulting “mimids” object contains the original imputed data and the output of the calls to matchit() applied to each imputed dataset.

The weighting step is performed very similarly using the weightthem() function. In this example weapply SMR weighting to arrive at the same ATT estimand as matching which is indicated through the estimand = "ATT" argument. In case we wanted to weight patients based on overlap weights, estimand = "AT0" would need to be specified (which is one of the sensitivity analyses in the FLAURA protocol).

To mitigate the risks of extreme weights, the subsequent trim() function truncates large weights by setting all weights higher than that at a given quantile (in this example the 95% quantile) to the weight at the quantile. Since we specify lower = TRUE, this is done symmetrically also with the 5% quantile.

# SMR weighting
data_wimids <- weightthem(
  formula = ps_form,
  datasets = data_imp,
  approach = 'within',
  method = "glm",
  estimand = "ATT"
  )

# trim extreme weights
data_wimids <- trim(
  x = data_wimids, 
  at = .95, 
  lower = TRUE
  )

data_wimids
A weightit object
 - method: "glm" (propensity score weighting with GLM)
 - number of obs.: 3500
 - sampling weights: none
 - treatment: 2-category
 - estimand: ATT (focal: 1)
 - covariates: dem_age_index_cont, dem_sex_cont, c_smoking_history, c_number_met_sites, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_ecog_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_stage_initial_dx_cont, dem_race, dem_region, dem_ses, c_time_dx_to_index
 - weights trimmed at 5% and 95%

The resulting “wimids” object contains the original imputed data and the output of the calls to weightit() applied to each imputed dataset.

3.4 Step 3 - Balance assessment

The inspection of balance assessment in multiple imputed and matched/weighted data can be done in a similar way as with a single complete dataset. For illustration we just look at the matched datasets, but the exact same principles also apply to the weighted datasets.

Table 3.1: Covariate balance table.
# create balance table
balance_table <- bal.tab(
  x = data_mimids, 
  stats = "m",
  abs = TRUE
  )

balance_table
Balance summary across all imputations
                                        Type Mean.Diff.Adj Max.Diff.Adj
distance                            Distance        0.0018       0.0019
dem_age_index_cont                   Contin.        0.0133       0.0314
dem_sex_cont                          Binary        0.0078       0.0183
c_smoking_history                     Binary        0.0070       0.0116
c_number_met_sites                   Contin.        0.0137       0.0267
c_hemoglobin_g_dl_cont               Contin.        0.0164       0.0331
c_urea_nitrogen_mg_dl_cont           Contin.        0.0179       0.0287
c_platelets_10_9_l_cont              Contin.        0.0132       0.0321
c_calcium_mg_dl_cont                 Contin.        0.0128       0.0297
c_glucose_mg_dl_cont                 Contin.        0.0109       0.0265
c_lymphocyte_leukocyte_ratio_cont    Contin.        0.0124       0.0309
c_alp_u_l_cont                       Contin.        0.0190       0.0442
c_protein_g_l_cont                   Contin.        0.0120       0.0254
c_alt_u_l_cont                       Contin.        0.0114       0.0265
c_albumin_g_l_cont                   Contin.        0.0147       0.0404
c_bilirubin_mg_dl_cont               Contin.        0.0171       0.0377
c_chloride_mmol_l_cont               Contin.        0.0242       0.0603
c_monocytes_10_9_l_cont              Contin.        0.0106       0.0218
c_eosinophils_leukocytes_ratio_cont  Contin.        0.0161       0.0391
c_ldh_u_l_cont                       Contin.        0.0156       0.0260
c_hr_cont                            Contin.        0.0145       0.0441
c_sbp_cont                           Contin.        0.0193       0.0489
c_oxygen_cont                        Contin.        0.0132       0.0310
c_ecog_cont                           Binary        0.0064       0.0145
c_neutrophil_lymphocyte_ratio_cont   Contin.        0.0226       0.0397
c_bmi_cont                           Contin.        0.0081       0.0175
c_ast_alt_ratio_cont                 Contin.        0.0170       0.0413
c_stage_initial_dx_cont              Contin.        0.0164       0.0384
dem_race_Asian                        Binary        0.0093       0.0161
dem_race_Other                        Binary        0.0055       0.0137
dem_race_White                        Binary        0.0073       0.0175
dem_region_Midwest                    Binary        0.0064       0.0178
dem_region_Northeast                  Binary        0.0047       0.0138
dem_region_South                      Binary        0.0087       0.0247
dem_region_West                       Binary        0.0080       0.0154
dem_ses                              Contin.        0.0157       0.0275
c_time_dx_to_index                   Contin.        0.0165       0.0399

Average sample sizes across imputations
               0      1
All       2069.  1431. 
Matched   1304.1 1304.1
Unmatched  764.9  126.9
love.plot(
  x = data_mimids,
  abs = TRUE,
  thresholds = 0.1, 
  drop.distance = TRUE,
  var.order = "unadjusted",
  colors = c("orange", "blue"), 
  stars = "std",
  shapes = 17, 
  size = 4, 
  grid = TRUE,
  position = "top"
  )
Figure 3.1: Covariate balance plot (love plot).
bal.plot(
  x = data_mimids,
  var.name = "distance",
  which = "both",
  which.imp = .none,
  colors = c("orange", "blue")
  )

3.5 Step 4 - Estimation of marginal treatment effects

Next, we compare the marginal treatment effect estimates coming from a Cox proportional hazards model after propensity score matching and weighting as implemented in the coxph() and in the svycoxph() functions.

From the MatchThem documentation:

Important
  • with() applies the supplied model in expr to the (matched or weighted) multiply imputed datasets, automatically incorporating the (matching) weights when possible. The argument to expr should be of the form glm(y ~ z, family = quasibinomial), for example, excluding the data or weights argument, which are automatically supplied.

  • Functions from the survey package, such as svyglm(), are treated a bit differently. No svydesign object needs to be supplied because with() automatically constructs and supplies it with the imputed dataset and estimated weights. When cluster = TRUE (or with() detects that pairs should be clustered; see the cluster argument above), pair membership is supplied to the ids argument of svydesign().

  • After weighting using weightthem(), glm_weightit() should be used as the modeling function to fit generalized linear models. It correctly produces robust standard errors that account for estimation of the weights, if possible. See WeightIt::glm_weightit() for details. Otherwise, svyglm() should be used rather than glm() in order to correctly compute standard errors.

  • For Cox models, coxph() will produce approximately correct standard errors when used with weighting, but svycoxph() will produce more accurate standard errors when matching is used.

We now want to compare treatment effect estimates for treat when computed (a) using coxph (survival package) and (b) svycoxph (survey package). More information on estimating treatment effects after matching is provided in https://kosukeimai.github.io/MatchIt/articles/estimating-effects.html#survival-outcomes

3.5.0.1 coxph

# coxph result
coxph_results <- with(
  data = data_mimids,
  expr = coxph(formula = Surv(fu_itt_months, death_itt) ~ treat, 
               weights = weights, 
               cluster = subclass,
               robust = TRUE
               )
  ) |> 
  pool() |> 
  tidy(exponentiate = TRUE, conf.int = TRUE) |> 
  mutate(package = "survival") |> 
  select(package, term, estimate, std.error, conf.low, conf.high) 

coxph_results

3.5.0.2 svycoxph

# svycoxph result
svycoxph_results <- with(
  data = data_mimids,
  expr = svycoxph(formula = Surv(fu_itt_months, death_itt) ~ treat),
  cluster = TRUE
  ) |> 
  pool() |> 
  tidy(exponentiate = TRUE, conf.int = TRUE) |> 
  mutate(package = "survey") |> 
  select(package, term, estimate, std.error, conf.low, conf.high)

svycoxph_results

3.5.0.3 Summary

rbind(coxph_results, svycoxph_results)
   package  term  estimate  std.error  conf.low conf.high
1 survival treat 0.7827165 0.04578948 0.7149254 0.8569358
2   survey treat 0.7827165 0.04580257 0.7149488 0.8569077

3.5.0.4 coxph

# coxph result
coxph_results <- with(
  data = data_wimids,
  expr = coxph(formula = Surv(fu_itt_months, death_itt) ~ treat,
               weights = weights, 
               robust = TRUE
               )
  ) |> 
  pool() |> 
  tidy(exponentiate = TRUE, conf.int = TRUE) |> 
  mutate(package = "survival") |> 
  select(package, term, estimate, std.error, conf.low, conf.high) 

coxph_results

3.5.0.5 svycoxph

# svycoxph result
svycoxph_results <- with(
  data = data_wimids,
  expr = svycoxph(formula = Surv(fu_itt_months, death_itt) ~ treat),
  cluster = TRUE
  ) |> 
  pool() |> 
  tidy(exponentiate = TRUE, conf.int = TRUE) |> 
  mutate(package = "survey") |> 
  select(package, term, estimate, std.error, conf.low, conf.high) 

svycoxph_results

3.5.0.6 Summary

rbind(coxph_results, svycoxph_results)
   package  term  estimate  std.error  conf.low conf.high
1 survival treat 0.7884026 0.03615620 0.7344116 0.8463629
2   survey treat 0.7884026 0.03616101 0.7344241 0.8463484

3.6 Session info

Script runtime: 1.04 minutes.

pander::pander(subset(data.frame(sessioninfo::package_info()), attached==TRUE, c(package, loadedversion)))
  package loadedversion
cobalt cobalt 4.5.5
dplyr dplyr 1.1.4
furrr furrr 0.3.1
future future 1.34.0
gtsummary gtsummary 2.0.1
here here 1.0.1
MatchThem MatchThem 1.2.1
Matrix Matrix 1.7-0
mice mice 3.16.0
parallelly parallelly 1.38.0
ranger ranger 0.16.0
survey survey 4.4-2
survival survival 3.5-8
pander::pander(sessionInfo())

R version 4.4.0 (2024-04-24)

Platform: x86_64-pc-linux-gnu

locale: LC_CTYPE=C.UTF-8, LC_NUMERIC=C, LC_TIME=C.UTF-8, LC_COLLATE=C.UTF-8, LC_MONETARY=C.UTF-8, LC_MESSAGES=C.UTF-8, LC_PAPER=C.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=C.UTF-8 and LC_IDENTIFICATION=C

attached base packages: grid, stats, graphics, grDevices, datasets, utils, methods and base

other attached packages: cobalt(v.4.5.5), furrr(v.0.3.1), future(v.1.34.0), ranger(v.0.16.0), parallelly(v.1.38.0), gtsummary(v.2.0.1), here(v.1.0.1), survey(v.4.4-2), Matrix(v.1.7-0), MatchThem(v.1.2.1), mice(v.3.16.0), survival(v.3.5-8) and dplyr(v.1.1.4)

loaded via a namespace (and not attached): tidyselect(v.1.2.1), farver(v.2.1.2), fastmap(v.1.2.0), digest(v.0.6.37), rpart(v.4.1.23), lifecycle(v.1.0.4), magrittr(v.2.0.3), compiler(v.4.4.0), rlang(v.1.1.4), sass(v.0.4.9), tools(v.4.4.0), utf8(v.1.2.4), yaml(v.2.3.10), gt(v.0.11.0), knitr(v.1.48), labeling(v.0.4.3), htmlwidgets(v.1.6.4), xml2(v.1.3.6), withr(v.3.0.1), purrr(v.1.0.2), nnet(v.7.3-19), fansi(v.1.0.6), jomo(v.2.7-6), colorspace(v.2.1-1), ggplot2(v.3.5.1), globals(v.0.16.3), scales(v.1.3.0), iterators(v.1.0.14), MASS(v.7.3-60.2), cli(v.3.6.3), rmarkdown(v.2.28), crayon(v.1.5.3), generics(v.0.1.3), sessioninfo(v.1.2.2), commonmark(v.1.9.1), minqa(v.1.2.8), DBI(v.1.2.3), pander(v.0.6.5), stringr(v.1.5.1), splines(v.4.4.0), assertthat(v.0.2.1), parallel(v.4.4.0), base64enc(v.0.1-3), mitools(v.2.4), vctrs(v.0.6.5), WeightIt(v.1.3.0), boot(v.1.3-30), glmnet(v.4.1-8), jsonlite(v.1.8.8), mitml(v.0.4-5), listenv(v.0.9.1), locfit(v.1.5-9.10), foreach(v.1.5.2), tidyr(v.1.3.1), glue(v.1.7.0), nloptr(v.2.1.1), pan(v.1.9), chk(v.0.9.2), codetools(v.0.2-20), stringi(v.1.8.4), shape(v.1.4.6.1), gtable(v.0.3.5), lme4(v.1.1-35.5), munsell(v.0.5.1), tibble(v.3.2.1), pillar(v.1.9.0), htmltools(v.0.5.8.1), R6(v.2.5.1), rprojroot(v.2.0.4), evaluate(v.0.24.0), lattice(v.0.22-6), markdown(v.1.13), backports(v.1.5.0), cards(v.0.2.1), tictoc(v.1.2.1), MatchIt(v.4.5.5), broom(v.1.0.6), renv(v.1.0.7), simsurv(v.1.0.0), Rcpp(v.1.0.13), nlme(v.3.1-164), xfun(v.0.47) and pkgconfig(v.2.0.3)

pander::pander(options('repos'))
  • repos:

    REPO_NAME
    https://packagemanager.posit.co/cran/linux/noble/latest

3.7